﻿package scrn;


import java.awt.*;
import java.awt.image.*;

import core.*;


// ======================================== Графическое поле и функции рисования
public class Draw {

//=================================================================== Переменные
protected static Graphics2D g; // Графическое поле
// Служит также для синхронизации с командами отрисовки.

// Экран
public static int dispW; // Размер экрана
public static int dispH;

public static Color bgColDefault = new Color(0xf0f0f0);

//Шрифты
protected static Font fontClk; // Для часов в сообщениях (маленький)
protected static Font fontStat; // Для строки статуса (маленький)
public static Font fontMess; // Для сообщений (средний)
protected static Font fontTit; // Для заголовков
public static int fontClkH, fontStatH, fontMessH, fontTitH; // Высота текстовой строки
public static int fontClkDes, fontStatDes, fontMessDes, fontTitDes; // Отступы шрифтов вниз от базовой строки
public static int timeMessW, timeStatW; // Ширина поля часов
public static int timeMessOff; // Ширина отступа от поля часов


// ======================================= Масштабные коэффициенты толщины линий
protected static int fact = 1;
protected static int fact2 = fact * 2;
protected static int fact3 = fact * 3;
protected static int fact4 = fact * 4;
protected static int fact5 = fact * 5;

public static BufferedImage scrImg;


// ================================================================ Цвет с тенью
static protected Color colShad(Color colBg, Color colShad) {

	int r1, r2;
	int g1, g2;
	int b1, b2;

	int colBgInt = colBg.getRGB();
	int colShadInt = colShad.getRGB();

	r1 = colBgInt & 0xff0000;
	g1 = colBgInt & 0x00ff00;
	b1 = colBgInt & 0x0000ff;

	r2 = colShadInt & 0xff0000;
	g2 = colShadInt & 0x00ff00;
	b2 = colShadInt & 0x0000ff;

	if (r1 < r2) {
		r1 = 0;
	} else {
		r1 -= r2;
	}

	if (g1 < g2) {
		g1 = 0;
	} else {
		g1 -= g2;
	}

	if (b1 < b2) {
		b1 = 0;
	} else {
		b1 -= b2;
	}

	return new Color(r1 >> 16, g1 >> 8, b1);
}


// =============================================================== Текст с тенью
static protected void drawShadText(String text, int x, int y, Color color,
		Color shadColor) {

	g.setColor(shadColor);
	g.drawString(text, x + Draw.fact, y + Draw.fact);
	g.setColor(color);
	g.drawString(text, x, y);

}


// ================================================== Освободить ресурсы и выйти
public static void exit() {

	g = null;
}


// =============================================================== Инициализация
public static void init() {

	// Создаем картинку
	scrImg = new BufferedImage(640, 500, BufferedImage.TYPE_INT_ARGB);
	g = (Graphics2D) scrImg.getGraphics();
	g.setColor(new Color(0xff, 0xff, 0xff, 0x00));
	g.fillRect(0, 0, 640, 500);

	initFont();
}


// ======================================================= Выдать метрику шрифта
public static FontMetrics getFontMetrics(Font font) {

	return g.getFontMetrics(font);
}


// ======================================================= Инициализация шрифтов
public static void initFont() {

	// Определяем высоту шрифтов
	fontClkH = 10;
	fontStatH = 10;
	fontTitH = 12;
	fontMessH = 12;

	// Mess.m("Scr.initFont", "Инициализирую шрифты");
	fontClk = new Font(Font.DIALOG, Font.PLAIN, fontClkH); // Для часов
	fontStat = new Font(Font.DIALOG, Font.PLAIN, fontStatH); // Для строки статуса
	fontMess = new Font(Font.DIALOG, Font.PLAIN, fontMessH); // Для сообщений
	fontTit = new Font(Font.DIALOG, Font.BOLD, fontTitH); // Для заголовков

	// Определяем ширину полей часов и отступы строк
	FontMetrics fontMetr = g.getFontMetrics(fontClk);
	fontClkDes = fontMetr.getDescent();

	timeMessW = fontMetr.stringWidth("88:88");
	timeMessOff = fontMetr.stringWidth(" ");

	fontMetr = g.getFontMetrics(fontStat);
	fontStatDes = fontMetr.getDescent();
	if (Setting.fClkSec) {
		timeStatW = fontMetr.stringWidth("88:88:88");
	} else {
		timeStatW = fontMetr.stringWidth("88:88");
	}

	fontMetr = g.getFontMetrics(fontMess);
	fontMessDes = fontMetr.getDescent();

	fontMetr = g.getFontMetrics(fontTit);
	fontTitDes = fontMetr.getDescent();

	// Определяем высоту строк
	fontClkH += fontClkDes;
	fontStatH += fontStatDes;
	fontTitH += fontTitDes;
	fontMessH += fontMessDes;
}


// =================================================== Градиентный прямоугольник
public static void rectG(Graphics g, int x, int y, int w, int h, Color color1,
		Color color2) {

	int col1 = color1.getRGB();
	int col2 = color2.getRGB();

	if (Setting.fGradient) { // Включены градиенты

		double r1, r2; // Компоненты красного. Начальный, конечный
		double g1, g2; // Компоненты зеленого. Начальный, конечный
		double b1, b2; // Компоненты синего. Начальный, конечный
		double h1 = h; // Высота для расчетов
		int yCur; // Текущая координата Y
		int yMax; // Максимальная координата Y
		double rStep; // Шаг изменения цвета
		double gStep;
		double bStep;
		double rPlus; // Накопленный шаг
		double gPlus;
		double bPlus;

		r1 = (col1 & 0x00ff0000) >> 16;
		r2 = (col2 & 0x00ff0000) >> 16;
		g1 = (col1 & 0x0000ff00) >> 8;
		g2 = (col2 & 0x0000ff00) >> 8;
		b1 = col1 & 0x000000ff;
		b2 = col2 & 0x000000ff;

		// Разница соседних цветов
		rStep = (r2 - r1) / h1;
		rPlus = rStep;
		gStep = (g2 - g1) / h1;
		gPlus = gStep;
		bStep = (b2 - b1) / h1;
		bPlus = bStep;

		yCur = 0;
		yMax = y + h;
		g.setColor(new Color(col1));
		w = x + w - 1;
		for (yCur = y; yCur < yMax; yCur++) {
			g.drawLine(x, yCur, w, yCur);
			g.setColor(new Color((int) (r1 + rPlus), (int) (g1 + gPlus),
					(int) (b1 + bPlus)));
			rPlus += rStep;
			gPlus += gStep;
			bPlus += bStep;
		}
	} else { // Выключены градиенты
		g.setColor(new Color(((col1 & 0xff0000) + (col2 & 0xff0000)) >> (16 + 1),
				((col1 & 0x00ff00) + (col2 & 0x00ff00)) >> (8 + 1),
				((col1 & 0x0000ff) + (col2 & 0x0000ff)) >> 1));
		g.fillRect(x, y, w, h);
	}


}


// ===================================================== Задать графическое поле
public static void setGr(Graphics2D gr) {

	Draw.g = gr;
}


// ======================================= Задать текущие размеры поля отрисовки
public static synchronized void setDim(Dimension drawDim) {

	dispW = drawDim.width;
	dispH = drawDim.height;

	if ((scrImg.getWidth() < dispW + 2) || (scrImg.getHeight() < dispH + 2)) {
		// Создаем новую картинку с запасом
		scrImg = new BufferedImage((dispW << 1) - (dispW >> 1), (dispH << 1)
				- (dispH >> 1), BufferedImage.TYPE_INT_ARGB);
		g = (Graphics2D) scrImg.getGraphics();
	}

	g.setColor(bgColDefault);
	g.setClip(0, 0, dispW + 2, dispH + 2);
	g.fillRect(0, dispH, dispW, 1);
	g.fillRect(dispW, 0, 1, dispH);

	//	Mess.m("Draw.setDim", dispW + "x" + dispH);
}


}
